1、信号量
	信号量是一个可以被多个进程访问的计数器，它常用于资源计数、互斥、同步等，通过shell命令ipcs -a可以查看所
有IPC，通过ipcs -s可以查看所有信号量
2、ftok
	根据一个已有的路径生成一个key值
	pathname: 路径
	proj_id: 工程ID
	成功返回key值，失败返回-1
	key_t ftok(const char *pathname, int proj_id);
3、semget
	创建或获取一个已经存在的信号量集合
	key: key值，用于区分不同的信号量集合，为IPC_PRIVATE则始终创建新的消息队列
	nsems: 集合中信号量的个数
	semflg: 创建标志及权限，通常为"创建标准|权限"
		IPC_CREAT 不存在则创建
		IPC_EXCL 与IPC_CREAT一起使用，不存在则创建，存在则报错
	成功返回信号量集合标识符，失败返回-1
	int semget(key_t key, int nsems, int semflg);
4、semctl
	控制信号量
	semid: 信号量集合标识符
	semnum: 要控制的信号量
	cmd: 控制命令
		IPC_STAT 拷贝内核中的信号量数据结构
		IPC_SET 设置内核中的信号量数据结构
		IPC_RMID 删除信号量集合
		IPC_INFO 获取信号量的信息
		GETALL 获取信号量集合中所有信号量的值
		GETNCNT 返回正在等待信号量的进程数目
		GETVAL 获取信号量的值
		SETALL 设置信号量集合中所有信号量的值
		SETVAL 设置信号量的值
	...: 是否需要此参数取决于cmd，当有此参数时参数数据类型如下：
		struct ipc_perm {
			key_t          __key; /* Key supplied to semget(2) */
			uid_t          uid;   /* Effective UID of owner */
			gid_t          gid;   /* Effective GID of owner */
			uid_t          cuid;  /* Effective UID of creator */
			gid_t          cgid;  /* Effective GID of creator */
			unsigned short mode;  /* Permissions */
			unsigned short __seq; /* Sequence number */
		};
		struct semid_ds {
			struct ipc_perm sem_perm;  /* Ownership and permissions */
			time_t          sem_otime; /* Last semop time */
			time_t          sem_ctime; /* Last change time */
			unsigned long   sem_nsems; /* No. of semaphores in set */
		};
		struct  seminfo {
			int semmap;  /* Number of entries in semaphore
							map; unused within kernel */
			int semmni;  /* Maximum number of semaphore sets */
			int semmns;  /* Maximum number of semaphores in all
							semaphore sets */
			int semmnu;  /* System-wide maximum number of undo
							structures; unused within kernel */
			int semmsl;  /* Maximum number of semaphores in a
							set */
			int semopm;  /* Maximum number of operations for
							semop(2) */
			int semume;  /* Maximum number of undo entries per
							process; unused within kernel */
			int semusz;  /* Size of struct sem_undo */
			int semvmx;  /* Maximum semaphore value */
			int semaem;  /* Max. value that can be recorded for
							semaphore adjustment (SEM_UNDO) */
		};
		union semun {
			int              val;    /* 用于 SETVAL */
			struct semid_ds *buf;    /* 用于 IPC_STAT, IPC_SET */
			unsigned short  *array;  /* 用于 GETALL, SETALL */
			struct seminfo  *__buf;  /* 用于 IPC_INFO */
		};
	成功返回值由cmd决定，失败返回-1
	int semctl(int semid, int semnum, int cmd, ...);
5、semop
	操作信号量
	semid: 信号量集合标识符
	sops: 
		struct sembuf {
			unsigned short sem_num;  /* 信号量编号 */
			short          sem_op;   /* 操作，>0增加指定值，<0减小指定值，如等于5则是释放5个，等于-5则是获取5个 */
			short          sem_flg;  /* 标志选项 
				IPC_NOWAIT 非阻塞式
				SEM_UNDO 进程终止后撤销它对信号量的修改，在用于互斥时建议使用此标志
				*/
		};
	成功返回0，失败返回-1
	int semop(int semid, struct sembuf *sops, size_t nsops);
